class EventBus {
  constructor() {
    this.events = {}; // 存储事件及其对应的回调函数列表
    // {
    //   事件名(eventName:string)：{
    //     事件队列(eventQueue:Array<Function>)
    //     事件缓存结果(eventCache:Any)
    //   }
    // }
  }

  // 订阅事件
  subscribe(eventName, callback) {
    // 如果事件不存在，创建一个空的回调函数列表+缓存
    if (!this.events[eventName]) {
      this.events[eventName] = {
        eventQueue: [],
        eventCache: null
      }
    } else if (this.events[eventName].eventCache !== null) {// 如果事件存在且缓存了非null结果，返回缓存结果
      callback(this.events[eventName].eventCache)
    }
    this.events[eventName].eventQueue.push(callback); // 将回调函数添加到事件的回调函数列表中

  }

  // 发布事件
  publish(eventName, data) {
    if (this.events[eventName]) {
      // 更新缓存
      this.events[eventName].eventCache = data
      this.events[eventName].eventQueue.forEach(callback => {
        callback(data); // 执行回调函数，并传递数据作为参数
      });

    }
  }

  // 取消订阅事件
  unsubscribe(eventName, callback) {
    if (this.events[eventName]) {
      const temp= this.events[eventName].eventQueue.filter(cb => cb !== callback); // 过滤掉要取消的回调函数
    
      this.events[eventName]=temp

      if(temp.length===0){//当前订阅为空，清空缓存
        this.events[eventName].eventCache=null
      }
    }
  }
}

module.exports = new EventBus()